#include "../headers/bib_Abrir_Configuracion.h"

static int obtenerConfiguracion(char *cadena);	/*Coloca cadena en el miembro correcto de la variable global (lo convierte si es valor numerico)*/
static int ValidaPuerto(int);	/*Valida que el puerto se encuentre en un rango correcto*/

extern char nivelLog;
extern CONFIG_EST config;


int abrirConfiguracion(void){

	char cadenaLeida[TAM_MAX];
	FILE *archivo;
	
	nivelLog = DEBUG;
	
	if (!(archivo = fopen(ARCHIVO_CONFIGURACION, "r"))){
		imprimirLog(ERROR, "No se pudo abrir el archivo de configuracion", ARCHIVO_CONFIGURACION);
		return FIN_ERROR;
	}
	imprimirLog(DEBUG, "Archivo de configuracion abierto", "");
	
	while (fgets(cadenaLeida, TAM_MAX, archivo))
		if (obtenerConfiguracion(cadenaLeida) == FIN_ERROR)
			return FIN_ERROR;
	
	if (fclose(archivo)){
		imprimirLog(WARNING, "No se pudo cerrar el descriptor del archivo de configuracion", "");
		return FIN_WARNING;
	}
	else{
		imprimirLog(DEBUG, "Archivo de configuracion cerrado", "");
		return FIN_OK;
	}
}
/*=====================================================================================*/
static int ValidaPuerto(int puerto){

	if (puerto < 0){
		imprimirLogNumerico(ERROR, "Numero de puerto Invalido:", puerto);
		return FIN_ERROR;
	}

	if (puerto < 1024){
		imprimirLog(WARNING, "El numero de puerto debe ser mayor a 1024", "");
		return FIN_WARNING;
	}
	
	return FIN_OK;
}
/*=====================================================================================*/
static int obtenerConfiguracion(char * cadena){

	char *ptr, *pszValor;
	char tokens[3 + 1] = "=\n\r";
	ptr = strtok(cadena, tokens);
	pszValor = strtok(NULL, tokens);
	
	if (!strcmp("NivelLog", ptr)){  /*Debe ser 3 o mas para que muestre todos los tipos de log */
		nivelLog = atoi(pszValor);		
		imprimirLog(INFO, "Nivel del Log:", pszValor);
	}

	else if (!strcmp("IP", ptr)){
		strcpy(config.ip, pszValor);
		imprimirLog(INFO, "IP:", pszValor);
	}
			
	else if (!strcmp("Puerto", ptr)){
		config.puerto = atoi(pszValor);
		if (ValidaPuerto(config.puerto) == FIN_ERROR)
			return FIN_ERROR;
		imprimirLog(INFO, "Puerto:", pszValor);
	}
	
	else if (!strcmp("cantConexMax", ptr)){
		config.cantConexMax = atoi(pszValor);
		imprimirLog(INFO, "Cantidad maxima de conexiones:", pszValor);
	}
	
	else if (!strcmp("tamCache", ptr)){
		config.tamCache = atoi(pszValor);
		imprimirLog(INFO, "Tamaño de la cache:", pszValor);
	}

	else{
		imprimirLog(WARNING, "Parametro invalido ingresado en la configuracion:", ptr);
		return FIN_WARNING;
	}

	return FIN_OK;
}
